package com.ruoyi.system.service.impl;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysSerialNo;
import com.ruoyi.system.mapper.SysSerialNoMapper;
import com.ruoyi.system.service.ISysSerialNoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 流水号自增Service业务层处理
 * 
 * @author cms
 * @date 2024-06-12
 */
@Service
public class SysSerialNoServiceImpl implements ISysSerialNoService {
    @Autowired
    private SysSerialNoMapper sysSerialNoMapper;

    /**
     * 流水号生成
     *
     * @param prefix 前缀
     * @param size 位数
     * @return 结果
     */
    @Override
    public synchronized String generateSerialNoWithDate(String prefix, int size) {

        String strDate = new SimpleDateFormat("yyyyMMdd").format(new Date());

        SysSerialNo sysSerialNo = new SysSerialNo();
        sysSerialNo.setSerialType(prefix);
        sysSerialNo.setSerialDate(strDate);
        List<SysSerialNo> sysSerialNoList = sysSerialNoMapper.selectSysSerialNoList(sysSerialNo);
        int serialNum = 1;
        if (StringUtils.isNotEmpty(sysSerialNoList)) {
            sysSerialNo = sysSerialNoList.get(0);
            serialNum = sysSerialNo.getSerialNum() + 1;
            // 更新
            sysSerialNo.setSerialNum(serialNum);
            sysSerialNo.setLastUpdateBy(SecurityUtils.getUsername());
            sysSerialNo.setLastUpdateTime(DateUtils.getNowDate());
            sysSerialNoMapper.updateSysSerialNo(sysSerialNo);
        } else {
            // 新增
            sysSerialNo.setSerialNum(serialNum);
            sysSerialNo.setLastUpdateBy(SecurityUtils.getUsername());
            sysSerialNo.setLastUpdateTime(DateUtils.getNowDate());
            sysSerialNoMapper.insertSysSerialNo(sysSerialNo);
        }

        // 前补0
        String paddedNum = String.format("%0" + size + "d", serialNum);

        StringBuffer retStr = new StringBuffer();
        retStr.append(prefix).append("-").append(strDate).append("-").append(paddedNum);

        return retStr.toString();
    }

    /**
     * 流水号生成
     *
     * @param prefix 前缀
     * @param size 位数
     * @return 结果
     */
    @Override
    public synchronized String generateSerialNo(String prefix, int size) {
        SysSerialNo sysSerialNo = new SysSerialNo();
        sysSerialNo.setSerialType(prefix);
        List<SysSerialNo> sysSerialNoList = sysSerialNoMapper.selectSysSerialNoList(sysSerialNo);
        int serialNum = 1;
        if (StringUtils.isNotEmpty(sysSerialNoList)) {
            sysSerialNo = sysSerialNoList.get(0);
            serialNum = sysSerialNo.getSerialNum() + 1;
            // 更新
            sysSerialNo.setSerialNum(serialNum);
            sysSerialNo.setLastUpdateBy(SecurityUtils.getUsername());
            sysSerialNo.setLastUpdateTime(DateUtils.getNowDate());
            sysSerialNoMapper.updateSysSerialNo(sysSerialNo);
        } else {
            // 新增
            sysSerialNo.setSerialNum(serialNum);
            sysSerialNo.setLastUpdateBy(SecurityUtils.getUsername());
            sysSerialNo.setLastUpdateTime(DateUtils.getNowDate());
            sysSerialNoMapper.insertSysSerialNo(sysSerialNo);
        }

        // 前补0
        String paddedNum = String.format("%0" + size + "d", serialNum);

        StringBuffer retStr = new StringBuffer();
        retStr.append(prefix).append("-").append(paddedNum);

        return retStr.toString();
    }

}
